import {baseUrl} from "@/api/constant";
import axios from 'axios';
import * as qiniu from 'qiniu-js';
import ElementUI from 'element-ui';

/**
 * 获取七牛云token
 */
export function getQiniuToken(callback) {
  axios.get(baseUrl + '/system/get_file_token').then((res) => {
    let retObj = res.data;
    if (retObj.code == 0) {
      callback(retObj.data);
    }
  }).catch((error) => {
    ElementUI.Message.error(error);
  })
}


/**
 * 上传七牛云
 * @param avatar
 * @param token
 */
export function uploadQiniu(avatar, token, callback) {
  let file = convertBase64ToBlob(avatar); //Blob 对象，上传的文件
  let key = null; // 上传后文件资源名以设置的 key 为主，如果 key 为 null 或者 undefined，则文件资源名会以 hash 值作为资源名。
  let config = {
    useCdnDomain: true, //表示是否使用 cdn 加速域名，为布尔值，true 表示使用，默认为 false。
    region: qiniu.region.z2 // 根据具体提示修改上传地区,当为 null 或 undefined 时，自动分析上传域名区域};
  };

  let putExtra = {
    fname: "", //文件原文件名
    params: {}, //用来放置自定义变量
    mimeType: null //用来限制上传文件类型，为 null 时表示不对文件类型限制；限制类型放到数组里： ["image/png", "image/jpeg", "image/gif"]
  };
  let observable = qiniu.upload(file, key, token, putExtra, config);

  observable.subscribe({
    next: (res) => {//主要用来展示进度
      let total = res.total;
    },
    error: (err) => {//失败报错信息
      this.$message.error({message: '上传失败，请重试', duration: 2000});
    },
    complete: (res) => {//接收成功后返回的信息
      callback("http://pic.lanpin123.com/" + res.hash)
    }
  })
}

/**
 * 将base64转换为文件对象
 * @param base64字符串
 * @returns {Blob}
 */
function convertBase64ToBlob(base64) {
  var base64Arr = base64.split(',');
  var imgtype = '';
  var base64String = '';
  if (base64Arr.length > 1) {
    //如果是图片base64，去掉头信息
    base64String = base64Arr[1];
    imgtype = base64Arr[0].substring(base64Arr[0].indexOf(':') + 1, base64Arr[0].indexOf(';'));
  }
  // 将base64解码
  var bytes = atob(base64String);
  //var bytes = base64;
  var bytesCode = new ArrayBuffer(bytes.length);
  // 转换为类型化数组
  var byteArray = new Uint8Array(bytesCode);

  // 将base64转换为ascii码
  for (var i = 0; i < bytes.length; i++) {
    byteArray[i] = bytes.charCodeAt(i);
  }

  // 生成Blob对象（文件对象）
  return new Blob([bytesCode], {type: imgtype});
}
